<?php
	/**
	  * @package	MyDebuger
	  * @name		MyTools
	  * @brief		Clase con funciones estaticas de herramientas
	  * @author		Hermann D. Schimpf <hschimpf@gschimpf.com>
	  * @license	http://opensource.org/licenses/gpl-2.0.php
	  * @date		2010-01-04
	  * @version	0.3.4
  	**/

	final class MyTools extends MyDebuger implements MyVersions {
		/* version de la clase */
		private static $version			= 0;
		/* subversion de la clase */
		private static $subversion		= 3;
		/* numero de revision de la clase */
		private static $revision		= 4;

		/* bandera interna para obligar la habilitacion de la depuracion */
		private static $fullDebug		= False;

		public final function __construct($debug = False) {
			/* creamos el padre */
			parent::__construct($debug, __CLASS__);
		}

		public function __destruct() {
			/* matamos el padre */
			parent::__destruct();
		}

		public static final function getVersion() {
			/* retornamos la version actual de la clase */
			return 'v' . self::$version . '.' . self::$subversion . '.' . self::$revision;
		}

		private function verificarExistenciaClase($className) {
			try {
				try {
					/* verificamos si la clase existe */
					if ($this->verificarExistencia($className) !== True)
						/* si no existe intentamos cargarla */
						$this->cargarClase($className);
					/* retornamos True */
					return True;
				} catch (Exception $e) {
					/* capturamos todos los errores y los transformamos en mi excepcion */
					$this->convertToMyException($e);
				}
			} catch (MyException $e) {
				/* si se produjo una excepcion la manejamos con el metodo 'show' */
				$this->show($e->getMensaje());
			}
		}

		private function verificarExistencia($className) {
			/* mostramos un mensaje */
			$this->show('Verificando existencia de la clase ' . $this->italic($className) . '..', False);
			/* verificamos si existe la clase */
			if (class_exists($className)) {
				/* mostramos ok al mensaje */
				$this->showOK();
				/* retornamos True */
				return True;
			} else
				/* mostramos un mensaje */
				$this->show($this->red('La clase ' . $this->italic($className) . ' no existe'));
			/* retornamos false */
			return False;
		}

		private function cargarClase($className) {
			/* mostramos un mensaje */
			$this->show('Intentando cargar la clase ' . $this->italic($className) . ' desde MyLoader..');
			/* verificamos la clase MyLoader */
			$this->verificarMyLoader();
			/* creamos la instancia */
			$MyLoader = new MyLoader($this->getDebugStatus());
			/* intentamos cargar la clase */
			if ($MyLoader->load($className) !== True)
				/* salimos con una excepcion */
				$this->newException('La clase ' . $this->italic($className) . ' no se pudo cargar');
			/* eliminamos la instancia */
			unset($MyLoader);
		}

		private function verificarMyLoader() {
			/* mostramos un mensaje */
			$this->show('Verificando existencia de la clase MyLoader..', False);
			/* verificamos que la clase MyLoader exista */
			if (!class_exists('MyLoader'))
				/* salimos con una excepcion */
				$this->newException('La clase MyLoader no existe');
			/* verificamos si la clase que me llamo es MyLoader */
			elseif ($this->getCalled() == 'MyLoader')
				/* salimos con una excepcion */
				$this->newException('La clase MyLoader es la solicitante del metodo y se entrara en un bucle infinito');
			/* mostramos ok al mensaje */
			$this->showOK();
		}

		private function getCalled() {
			/* creamos una instancia de la clase Exception */
			$trace = new Exception;
			/* obtenemos la ruta que se siguo hasta este momento */
			$trace = $trace->getTrace();
			/* recorremos la lista */
			for ($i = 0; $i < (count($trace) - 1); $i++) {
				/* verificamos si luego de llamar a esta clase se llama a otra */
				if ($trace[$i]['class'] === __CLASS__ && $trace[$i + 1]['class'] !== __CLASS__)
					/* retornamos el nombre de la clase que llamo aqui */
					return $trace[$i + 1]['class'];
			}
		}

		public static function showDefinitionOf($classOrInterface = Null, $showProtecteds = False, $showPrivates = False, $debug = False) {
			/* creamos la instancia */
			$showDefinitionOf = new MyTools(self::$fullDebug || $debug ? True : False);
			/* verificamos que la clase exista */
			if ($showDefinitionOf->verificarExistenciaClase('ClassDefinitor'))
				/* retornamos el resultado del metodo */
				return ClassDefinitor::showDefinitionOf($classOrInterface, $showProtecteds, $showPrivates, (self::$fullDebug || $debug ? True : False));
		}

		public static function validateUrl($url = Null, $debug = False) {
			/* creamos la instancia */
			$validateUrl = new MyTools(self::$fullDebug || $debug ? True : False);
			/* verificamos que la clase exista */
			if ($validateUrl->verificarExistenciaClase('UrlValidator'))
				/* retornamos el resultado del metodo */
				return UrlValidator::validateUrl($url, (self::$fullDebug || $debug ? True : False));
		}

		public static function validateEmail($email = Null, $debug = False) {
			/* creamos la instancia */
			$validateEmail = new MyTools(self::$fullDebug || $debug ? True : False);
			/* verificamos que la clase exista */
			if ($validateEmail->verificarExistenciaClase('EmailValidator'))
				/* retornamos el resultado del metodo */
				return EmailValidator::validateEmail($email, (self::$fullDebug || $debug ? True : False));
		}

		public static function convertToWords($number = Null, $female = False, $debug = False) {
			/* creamos la instancia */
			$convertToWrods = new MyTools(self::$fullDebug || $debug ? True : False);
			/* verificamos que la clase exista */
			if ($convertToWrods->verificarExistenciaClase('NumberConverter'))
				/* retornamos el resultado del metodo */
				return NumberConverter::convertToWords($number, $female, (self::$fullDebug || $debug ? True : False));
		}

		public static function validateUserName($userName = Null, $debug = False) {
			/* creamos la instancia */
			$validateUserName = new MyTools(self::$fullDebug || $debug ? True : False);
			/* verificamos que la clase exista */
			if ($validateUserName->verificarExistenciaClase('UserNameValidator'))
				/* retornamos el resultado del metodo */
				return UserNameValidator::validateUserName($userName, (self::$fullDebug || $debug ? True : False));
		}

		public static function validateIp($ipDir = Null, $debug = False) {
			/* creamos la instancia */
			$validateIp = new MyTools(self::$fullDebug || $debug ? True : False);
			/* verificamos que la clase exista */
			if ($validateIp->verificarExistenciaClase('IpValidator'))
				/* retornamos el resultado del metodo */
				return IpValidator::validateIp($ipDir, (self::$fullDebug || $debug ? True : False));
		}

		public static function replaceBBCode($string = Null, $debug = False) {
			/* creamos la instancia */
			$replaceBBCode = new MyTools(self::$fullDebug || $debug ? True : False);
			/* verificamos que la clase exista */
			if ($replaceBBCode->verificarExistenciaClase('BBCodeGenerator'))
				/* retornamos el resultado del metodo */
				return BBCodeGenerator::replaceBBCode($string, (self::$fullDebug || $debug ? True : False));
		}

		public static function ObjectToArray($object = Null, $debug = False) {
			/* creamos la instancia */
			$ObjectToArray = new MyTools(self::$fullDebug || $debug ? True : False);
			/* verificamos que la clase exista */
			if ($ObjectToArray->verificarExistenciaClase('ObjectToArray'))
				/* retornamos el resultado del metodo */
				return ObjectToArray::toArray($object, (self::$fullDebug || $debug ? True : False));
		}

		public static function ArrayToObject($array = Null, $debug = False) {
			/* creamos la instancia */
			$ArrayToObject = new MyTools(self::$fullDebug || $debug ? True : False);
			/* verificamos que la clase exista */
			if ($ArrayToObject->verificarExistenciaClase('ObjectToArray'))
				/* retornamos el resultado del metodo */
				return ObjectToArray::toObject($array, (self::$fullDebug || $debug ? True : False));
		}

		public static function getCombinations($elements = Null, $debug = False) {
			/* creamos la instancia */
			$getCombinations = new MyTools(self::$fullDebug || $debug ? True : False);
			/* verificamos que la clase exista */
			if ($getCombinations->verificarExistenciaClase('CombinationsBuilder'))
				/* retornamos el resultado del metodo */
				return CombinationsBuilder::getCombinations($elements, (self::$fullDebug || $debug ? True : False));
		}

		public static function encrypt($value = Null, $key = Null, $debug = False) {
			/* creamos la instancia */
			$encrypt = new MyTools(self::$fullDebug || $debug ? True : False);
			/* verificamos que la clase exista */
			if ($encrypt->verificarExistenciaClase('Crypter'))
				/* retornamos el resultado del metodo */
				return Crypter::encrypt($value, $key, (self::$fullDebug || $debug ? True : False));
		}

		public static function decrypt($value = Null, $key = Null, $debug = False) {
			/* creamos la instancia */
			$decrypt = new MyTools(self::$fullDebug || $debug ? True : False);
			/* verificamos que la clase exista */
			if ($decrypt->verificarExistenciaClase('Crypter'))
				/* retornamos el resultado del metodo */
				return Crypter::decrypt($value, $key, (self::$fullDebug || $debug ? True : False));
		}

		public static function checkFile($fileName = Null, $withWritable = False, $debug = False) {
			/* creamos la instancia */
			$checkFile = new MyTools(self::$fullDebug || $debug ? True : False);
			/* verificamos que la clase exista */
			if ($checkFile->verificarExistenciaClase('FileChecker'))
				/* retornamos el resultado del metodo */
				return FileChecker::checkFile($fileName, $withWritable, (self::$fullDebug || $debug ? True : False));
		}

		public static function urlExists($url = Null, $debug = False) {
			/* creamos la instancia */
			$urlExists = new MyTools(self::$fullDebug || $debug ? True : False);
			/* verificamos que la clase exista */
			if ($urlExists->verificarExistenciaClase('UrlProcessor'))
				/* retornamos el resultado del metodo */
				return UrlProcessor::urlExists($url, (self::$fullDebug || $debug ? True : False));
		}
	}
?>